home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 20 / 5 / DISK2058.ZIP / UNFAST.EXE / SED.F < prev    next >
Text File  |  1989-10-06  |  5KB  |  274 lines

  1. ;Sector editor.
  2.  
  3. dr=80h ;C: by default.
  4. if (peekb 81h=' ') and (peekb 83h=':') then
  5.     {
  6.     dr=(ucase peekb 82h)-'A'
  7.     if dr>1 then dr+=80h-2
  8.     }
  9.  
  10. if dr<80h then
  11.     {
  12.     print bios "Tracks:  ";:tracks=input:print bios
  13.     print bios "Heads:     ";:heads=input:print bios
  14.     print bios "Sectors: ";:sectors=input:print bios
  15.     if (tracks=0) or (heads=0) or (sectors)=0 then beep:stop
  16.     }
  17. else
  18.     {
  19.     reg dx=dr,ax=800h:int 13h
  20.     if carry then print bios "SED: Can't read disk parameters!":terminate
  21.     cx=reg cx
  22.     heads=1+high reg dx
  23.     tracks=high cx+((low cx and 192)*4)
  24.     sectors=cx and 63
  25.     }
  26.  
  27. screen 3
  28. buffer ? 512
  29.  
  30. s=1:t=0:h=0
  31. text=0:opened=0
  32.  
  33. proc clearb(sx) locate 24,sx:repeat 80-sx print " ";
  34.  
  35. proc show_where
  36.     {
  37.     colour 120
  38.     locate 5,0:print "Track:";t;:printb "  Head:";h;"  Sector:";s;"  ";
  39.     m=5*160+1:repeat 80 video[m]b=120:m+=2
  40.     colour 7
  41.     }
  42.  
  43. function nexts
  44.     {
  45.     s++
  46.     if s>sectors then s=1:h++:if h>(heads-1) then h=0:t++
  47.     if t>=tracks then t=tracks-1:s=sectors:h=heads-1:return 0
  48.     return 1
  49.     }
  50.  
  51. function inp(a,b)
  52.     {
  53.     start:
  54.     cursor 24,0:print bios "? ";
  55.     i=input
  56.     if (i<a) or (i>b) then beep:goto start
  57.     clearb(0)
  58.     return i
  59.     }
  60.  
  61. proc abort cls:terminate
  62.  
  63. proc display
  64.     {
  65.     bm=buffer
  66.     for dy=7 to 22
  67.     for dx=0 to 15
  68.     if text then
  69.     {
  70.     c1=peekb bm;
  71.     c2=peekb (bm+1)
  72.     locate dy,dx*2+4:print chr c1;chr c2;
  73.     c1=c1 and 127
  74.     c2=c2 and 127
  75.     if c1<32 then c1='.'
  76.     if c2<32 then c2='.'
  77.     locate dy,44+dx*2:print chr c1;chr c2;
  78.     }
  79.     else
  80.     {
  81.     locate dy,dx*5
  82.     printh peek bm;
  83.     }
  84.     bm+=2
  85.     next dx,dy
  86.     }
  87.  
  88. function reads
  89.     {
  90.     show_where
  91.     read2:
  92.     edited=0
  93.     hl=h*256+dr
  94.     cl=t*256+s+(t/256)*64
  95.     reg es=reg cs,bx=buffer,dx=hl,cx=cl,ax=0201h:int 13h
  96.     if carry then
  97.     {
  98.     show_where
  99.     locate 24,0:print "Read error, skip ";:colour 15:print "S";
  100.     colour 7:print "ector or ";:colour 15:print "H";
  101.     colour 7:print "ead?";
  102.     loctocur
  103.     retryk:
  104.     wait for keypressed
  105.     k=ucase    key
  106.     if (k<>'S') and    (k<>'H') and (k<>27) then goto retryk
  107.     clearb(0)
  108.  
  109.     if k='S' then r=nexts:goto read2
  110.     if k='H' then s=sectors:r=nexts:goto read2
  111.  
  112.     show_where
  113.     return 0
  114.     }
  115.  
  116.     show_where
  117.     return 1
  118.     }
  119.  
  120. cls
  121. locate 0,30:print "Sector EDitor"
  122. locate 2,0:print "Track Head Sector ESCape Ascii heX Find Open Write Close"
  123. m=2*160
  124. repeat 80
  125.     {
  126.     b=video[m]b
  127.     if (b=(ucase b)) and (b>='A') then video[m+1]b=120
  128.     m+=2
  129.     }
  130.  
  131. main:
  132. locate 4,0:if opened
  133.     then print "Disk file open.";
  134.     else print "               ";
  135. locate 1,62:print "1>Tracks:  ";tracks;"  ";
  136. locate 2,62:printb "2>Heads:   ";heads;"  ";
  137. locate 3,62:printb "3>Sectors: ";sectors;"  ";
  138. m=160+62*2+1
  139. repeat 3 video[m]b=120:m+=160
  140.  
  141. if not reads then abort
  142.  
  143. disp2:
  144. display
  145. enter:
  146. clearb(0)
  147. wait for keypressed
  148. ks=keyscan
  149. k=ucase low ks
  150. sc=high ks
  151.  
  152. if k=27 then abort
  153. if k='A' then
  154.     {
  155.     text=1
  156.     scroll 0,7,79,22,0
  157.     goto disp2
  158.     }
  159. if k='X' then
  160.     {
  161.     text=0
  162.     scroll 0,7,79,22,0
  163.     goto disp2
  164.     }
  165.  
  166. if (k='O') and (opened=0) then
  167.     {
  168.     cursor 24,0:print bios "File name: ";
  169.     inputs file
  170.     if peekb (file+2)<>13 then
  171.     {
  172.     asciiz file
  173.     create #1,file+2:if error then goto main
  174.     opened=1
  175.     goto main
  176.     }
  177.     }
  178. if (k='C') and (opened=1) then
  179.     {
  180.     close #1:if error then beep
  181.     opened=0
  182.     goto main
  183.     }
  184. if (k='W') and (opened=1) then
  185.     {
  186.     write #1,512 from buffer:if error then beep
  187.     noise 500,600:noise off
  188.     }
  189.  
  190. if k='F' then
  191.     {
  192.     cursor 24,0:print bios "Find: ";
  193.     inputs fstr
  194.     if peekb (fstr+2)=13 then goto enter
  195.     os=s:ot=t:oh=h
  196.     forever
  197.     {
  198.     anotherf:
  199.     if not nexts then beep:t=ot:h=oh:s=os:goto main
  200.     if not reads then goto main
  201.  
  202.     if key=27 then beep:t=ot:h=oh:s=os:goto main
  203.  
  204.     m=buffer
  205.     f=peekb (fstr+2)
  206.     anobyte:
  207.     m=searchb buffer+512-m from m for f
  208.     if not m then goto nextfind
  209.     f=fstr+3:m++
  210.     while peekb f<>13
  211.         {
  212.         if peekb f<>peekb m then goto nfbyte
  213.         m++
  214.         f++
  215.         }
  216.  
  217.     display
  218.     y=(m-buffer)/32
  219.     x=(m-buffer) and 31
  220.     if text
  221.         then cursor y+7,x+4
  222.         else cursor y+7,(x/2)*5+(x and 1)*2
  223.     colour 15:locate 24,50:print "Found: F for next match.";:colour 7
  224.     beep:wait for keypressed
  225.     clearb(50)
  226.     if (ucase key)='F' then goto anotherf
  227.     goto main
  228.  
  229.     nfbyte:
  230.     if m<(buffer+512) then goto anobyte
  231.  
  232.     nextfind:
  233.     }
  234.     }
  235.  
  236. if k='T' then t=inp(0,tracks-1):goto main
  237. if k='H' then h=inp(0,heads-1):goto main
  238. if k='S' then s=inp(1,sectors):goto main
  239.  
  240. if k='1' then tracks=inp(0,1023):goto main
  241. if k='2' then heads=inp(0,15):goto main
  242. if k='3' then sectors=inp(1,63):goto main
  243.  
  244. if sc=80 then
  245.     {
  246.     t++:if t>=tracks then t=tracks-1:s=sectors:h=heads-1
  247.     goto main
  248.     }
  249. if sc=81 then
  250.     {
  251.     if not nexts then beep
  252.     goto main
  253.     }
  254. if sc=72 then
  255.     {
  256.     t--:if t<0 then t=0:s=1:h=0
  257.     goto main
  258.     }
  259. if sc=73 then
  260.     {
  261.     s--
  262.     if s<1 then s=sectors:h--:if h<0 then h=heads-1:t--
  263.     if t<0 then t=0
  264.     goto main
  265.     }
  266.  
  267. goto enter
  268.  
  269. fstr:
  270. string 20
  271.  
  272. file:
  273. string 25
  274.